package com.example.jdbc_test.dao.impl;

import com.example.jdbc_test.dao.StaffDao;
import com.example.jdbc_test.pojo.Staff;
import com.example.jdbc_test.util.DruidDbUtil;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import java.sql.SQLException;
import java.util.List;
import java.util.logging.Logger;

/**
 * @ClassName StaffDaoImpl
 * @Description TODO
 * @Author Kx
 * @Date 2025/2/25 11:01
 * @Version 1.0
 */
public class StaffDaoImpl implements StaffDao {
    /**
     * 创建日志记录器
     **/
    private static final Logger logger = Logger.getLogger(StaffDaoImpl.class.getName());
    /**
     * @description: 添加员工信息
     * @author: Kx
     * @date: 2025/2/25 11:24
     * @param: [staff 员工信息]
     * @return: int 受影响行数
     **/
    @Override
    public int addStaff(Staff staff) {
        // 1. 定义 SQL 语句
        String sql = "insert into staffs(name,age,phone,sta_pos) values (?,?,?,?)";
        // 2. 定义 DbUtil 工具类的 SQL 执行器
        QueryRunner queryRunner = new QueryRunner(DruidDbUtil.getDataSource());

        int row = 0;

        try {
            // 3. 执行SQL语句
            row = queryRunner.update(sql,staff.getName(),staff.getAge(),staff.getPhone(),staff.getStaPos());
        } catch (SQLException e) {
            logger.severe("执行SQL语句失败" + e.getMessage());
        }
        return row;
    }

    /**
     * @description: 根据编号删除员工信息
     * @author: Kx
     * @date: 2025/2/25 11:33
     * @param: [id 员工编号]
     * @return: int 受影响行数
     **/
    @Override
    public int deleteStaff(int id) {
        // 1. 定义 SQL 语句
        String sql = "DELETE FROM staffs WHERE `id` = ?";

        // 2. 创建DbUtil 工具类的 SQL 执行器
        QueryRunner queryRunner = new QueryRunner(DruidDbUtil.getDataSource());

        // 定义存储受影响行数
        int row = 0;

        // 3. 执行SQL语句
        try {
            row = queryRunner.update(sql,id);
        } catch (SQLException e) {
            logger.severe("执行SQL语句失败" + e.getMessage());
        }
        return row;
    }

    /**
     * @description: 根据编号修改员工信息
     * @author: Kx
     * @date: 2025/2/25 11:40
     * @param: [staff 员工信息]
     * @return: int 受影响行数
     **/
    @Override
    public int updateStaff(Staff staff) {
        // 1. 定义 SQL 语句
        String sql = "UPDATE staffs SET `name` = ?,`age` = ? WHERE `id` = ? ";

        // 2. 创建 DbUtil 工具类的 SQL 执行器
        QueryRunner queryRunner = new QueryRunner(DruidDbUtil.getDataSource());

        // 定义一个数存储受影响行数
        int row = 0;

        // 3. 执行 SQL 语句
        try {
            row = queryRunner.update(sql,staff.getName(),staff.getAge(),staff.getId());
        } catch (SQLException e) {
            logger.severe("执行SQL语句失败" + e.getMessage());
        }
        return row;
    }

    /**
     * @description: 分页查询员工信息
     * @author: Kx
     * @date: 2025/2/26 15:29
     * @param: [page 当前页, size 每页显示数]
     * @return: java.util.List<com.example.jdbc_test.pojo.Staff> 所有员工信息
     **/
    @Override
    public List<Staff> queryStaff(int page, int size) {
        // 1. 定义 SQL 语句
        String sql = "select id,name,age,phone,sta_pos as staPos,add_time as addTime,update_time as updateTime from staffs limit ?,?";

        // 2. 创建 DbUtil 工具类的 SQL 执行器
        QueryRunner queryRunner = new QueryRunner(DruidDbUtil.getDataSource());

        // 计算当前页的起始位置
        int start = (page - 1) * size;

        // 定义集合实体类对象
        List<Staff> staff = null;

        // 3. 执行 SQL 语句
        try {
            staff = queryRunner.query(sql, new BeanListHandler<>(Staff.class),start,size);          // 必须使用LocalDateTime类型
        } catch (SQLException e) {
            logger.severe("执行SQL语句失败" + e.getMessage());
        }
        return staff;
    }

    /**
     * @description: 根据编号查询员工信息
     * @author: Kx
     * @date: 2025/2/25 11:54
     * @param: [id 员工编号]
     * @return: com.example.jdbc_test.pojo.Staff 员工信息
     **/
    @Override
    public Staff queryStaffById(int id) {
        // 1. 定义 SQL 语句
        String sql = "select id,name,age,phone,sta_pos as staPos,add_time as addTime,update_time as updateTime from staffs where id = ?";

        // 2. 创建 DbUtil 工具类的 SQL 执行器
        QueryRunner queryRunner = new QueryRunner(DruidDbUtil.getDataSource());

        // 创建 实体类对象
        Staff staff = null;

        // 3. 执行 SQL 语句
        try {
            staff = queryRunner.query(sql,new BeanHandler<>(Staff.class),id);
        } catch (SQLException e) {
            logger.severe("执行SQL语句失败" + e.getMessage());
        }
        return staff;
    }
}
